home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / asmexam.arc / PASSWORD.ASM < prev    next >
Assembly Source File  |  1983-11-17  |  8KB  |  203 lines

  1.         page 55,132
  2. ;------------------------------------------------------------------------------
  3. ;PASSWORD.ASM (creates PWORD.SYS, device driver)
  4. ;
  5. ;DOS 2.00 Device driver forces user to enter password on booting up
  6. ;and disables Ctrl-Break.
  7. ;
  8. ;After assembly: link PASSWORD (ignore "no STACK" error)
  9. ;                exec2bin PASSWORD PASSWORD.SYS
  10. ;                place DEVICE=PASSWORD.SYS in CONFIG.SYS file
  11. ;                reboot system with Ctrl-Alt-Del
  12. ;                answer prompt with: PassWord <enter>
  13.  
  14. dev_seg      segment
  15. pword_device proc far
  16.              assume cs:dev_seg,ds:dev_seg,es:dev_seg
  17.  
  18. ;-------------------------------
  19. ;The following lines are the device header, which must exist for
  20. ;every device.  This file has only one device, and it works with
  21. ;character I/O.  It doesn't actually handle any I/O services,
  22. ;but it's easier to create a character device.
  23.  
  24. pword_dev_header:   ;label for the start of the device driver
  25.  
  26. next_dev_ptr       dd -1               ;only 1 device is defined in this file
  27. dev_attribute      dw 8000h            ;character device (simpler that way)
  28. strategy_ptr       dw  strategy        ;the installation proc
  29. interrupt_ptr      dw  interrupt       ;the proc that handles all service requests
  30. device_name        db  'PASSWORD'      ;8-byte string of device name
  31.  
  32. ;--- This is the stroage area for the password --
  33. ;--- The first byte is the length (0-16) --------
  34. ;--- The following characters are the password --
  35. ;--- Only an exact match will allow the system --
  36. ;--- to continue the boot process ---------------
  37.  
  38. password_store     db 8,'PassWord'
  39.                    db $-password_store dup(' ')       ;leave room for a
  40.                                                       ;16 character password
  41.  
  42. in_buf_max  db 16        ;input buffer for reading password from user
  43. in_buf_len  db ?         ;it is set up for DOS service OAH, BUFFERED_INPUT
  44. in_buf      db 16 dup(?)
  45.  
  46. ;----- The STRATEGY proc stores ES:BX request header pointer here
  47. ;----- The INTERRUPT proc retrieves it
  48.  
  49. request_ptr label dword                ;defined as double word for LES opcode
  50. req_ptr_off dw  ?                      ;and as two words for MOV opcodes
  51. req_ptr_seg dw  ?
  52.  
  53.  
  54.  
  55. dummy_iret:                            ;Ctrl-Break vector is pointed here, so it
  56.             iret                       ;does nothing.  Break is not recognized.
  57.  
  58.  
  59.  
  60. ;------------------messages----------------------------------------------------
  61. ;These messages are expected to be output via the ANSI.SYS device,
  62. ;so it should be installed (named in the CONFIG.SYS file) before
  63. ;this PWORD device.
  64. ;If you don't want to use ANSI.SYS, remove the ESC sequences in the messages.
  65.  
  66.           lf  equ 0ah
  67.           cr  equ 0dh
  68.           esc equ 1bh
  69.  
  70. msg_1         db cr,lf,esc,'[0m'                 ;make output visible
  71.               db 'Enter Password: '
  72.               db esc,'[8m$'                     ;make input invisible
  73.  
  74. msg_2         db cr,lf,esc,'0m'                  ;make output visible
  75.               db 'Password accepted.',cr,lf,'$'
  76.  
  77.  
  78.  
  79. ;==============================================================================
  80. ;STRATEGY procedure
  81. ;Just saves the request header pointer for the INTERRUPT proc
  82.  
  83. strategy       proc far
  84.                assume cs:dev_seg
  85.  
  86.                mov  cs:req_ptr_off,bx
  87.                mov  cs:req_ptr_seg,es
  88.                ret                                ;far return to DOS
  89. strategy       endp
  90.  
  91.  
  92.  
  93. ;==============================================================================
  94. ;INTERRUPT procedure
  95. ;Processes the command indicated in the request header.
  96.  
  97. interrupt     proc far
  98.               assume cs:dev_seg,ds:nothing, es:nothing
  99.               push       ds                      ;preserve all registers
  100.               push       es
  101.               push       ax
  102.               push       bx
  103.               push       cx
  104.               push       dx
  105.               push       di
  106.               push       si
  107.               mov        ax,cs                   ;make DS address the
  108.               mov        ds,ax                   ;program data area
  109.  
  110.               les        bx,request_ptr          ;get the pointer saved by
  111.               mov        al,es:[bx+2]            ;fetch the command
  112.               cmp        al,0
  113.               je         init_fn                 ;only valid request in INI
  114. error_exit:
  115.               or         word ptr es:[bx+3],8003H       ;indicate error cod
  116.                                                         ;"Unknown command"
  117.  
  118. ;---- interrupt service request has been handled.
  119. ;---- Set he "done flag" and return to DOS.
  120.  
  121. common_exit:
  122.               or         word ptr es:[bx+3],100H        ;set the done bit
  123.               pop        si
  124.               pop        di
  125.               pop        dx
  126.               pop        cx
  127.               pop        bx
  128.               pop        ax
  129.               pop        es
  130.               pop        ds
  131.               ret                 ;far return
  132.  
  133.  
  134. ;---- Only the INIT function is handled by the PWORD device
  135. ;---- all other requests are routed through the error_exit.
  136.  
  137. ;----------------------------------
  138. ;INIT_FN procedure
  139. ;prompts the user for a password, keeps prompting until correct entry
  140. ;received,  Passes the address of this proc back to DOS as the end-of-driver
  141. ;address so that a minimum amount of storage is used.
  142.  
  143. init_fn       proc near
  144.  
  145.               push       es
  146.  
  147. ;--------------
  148. ;The following 4 lines eliminate Ctrl-Break from having
  149. ;any effect on the system, unless another program
  150. ;KEYBOARD_BREAK vector is altered (BASIC does that).
  151.  
  152.               mov        ax,0
  153.               mov        es,ax
  154.               mov        word ptr es:[1Bh*4],offset dummy_iret
  155.               mov        word ptr es:[1Bh*4+2],cs
  156.               jmp        short no_beep
  157. try_again:
  158.               mov        al,7     ;bel character
  159.               mov        ah,0EH   ;WRITE_TTY service
  160.               int        10h
  161. no_beep:
  162.               mov        dx,offset msg_1         ;"Enter Password:"
  163.               mov        ah,9                    ;DOS print string service
  164.               int        21H
  165.  
  166.               mov        dx,offset in_buf_max
  167.               mov        ah,0Ch                  ;clear input buffer and..
  168.               mov        al,0Ah                  ;input a line of character
  169.               int        21H
  170.               mov        ax,cs
  171.               mov        es,ax                   ;set ES to target password
  172.                                                  ;DS already points to user
  173.               mov        si,offset in_buf_len
  174.               mov        ch,0
  175.               mov        cl,[si]
  176.               cmp        cl,[di]                 ;are lengths the same?
  177.               jne        try_again
  178.               inc        di                      ;point to first characters
  179.               inc        si                      ;of both strings
  180.               rep cmpsb                          ;all chars the same?
  181.               jne        try_again               ;no, start over
  182.  
  183.               mov        dx,offset msg_2 ;"Password accepted"
  184.               mov        ah,9
  185.               int        21H
  186.  
  187. ;---- now exit from INIT procedure -----------------------------
  188. ;---- retain only the minimum amount of code -------------------
  189. ;---- to handle erroneous service requests ---------------------
  190.  
  191.               pop        es
  192.               mov        word ptr es:[bx+0EH],offset init_fn
  193.               mov        word ptr es:[bx+10H],cs
  194.  
  195.  
  196.              jmp        common_exit
  197. init_fn      endp
  198.  
  199. interrupt    endp
  200. pword_device endp
  201. dev_seg      ends
  202.              end        pword_dev_header        ;must specify end for EXE2
  203.